#include "ft6336.h"
#include "main.h"
#include "app_lvgl.h"


//初始化FT6336触摸屏
//返回值:0,初始化成功;1,初始化失败 
esp_err_t ft6336_init(void)
{
    esp_err_t ret =0;
	uint8_t temp[2]; 
	

	temp[0] = FT6336_read_firmware_id();

    ft6336_DEBUG("读取寄存器:%x %x\r\n",temp[0],temp[1]);  
	if(temp[0]==0X7f)
	{
		//ft6336_DEBUG("CTP ID:%x\r\n",((uint16_t)temp[0]<<8)+temp[1]);
		ret = 0;

		ft6336_DEBUG("初始化成功\r\n");
		xTaskCreate(ft6336_test_task,"ft6336_test_task",1024*2,NULL,20,NULL);
	}else
    {
        ft6336_DEBUG("初始化失败\r\n");
       ret= 1; 
    }   
    return ret;
}


void ft6336_test_task(void *pvParameter)
{
	uint8_t temp[2];
	uint16_t x[2],y[2];
	while (1) 
    {

        // FT6336_Scan(0);

        // if(ft6336_data.sta&TP_PRES_DOWN)
        // {
        //     mouse_x = ft6336_data.x[0];
        //     mouse_y = ft6336_data.y[0];
        //     mouse_sta = ft6336_data.sta&TP_PRES_DOWN;
        //     //lvgl_YouBiao_SheZhi_WeiZhi(mouse_x, mouse_y,mouse_sta);

        // }else
        // {
        //     mouse_sta = 0;
        // }
		temp[0] = FT6336_read_touch1_event();		
		temp[2] = FT6336_read_touch2_event();
		x[0]=FT6336_read_touch1_x();
		y[0]=FT6336_read_touch1_y();
		x[1]=FT6336_read_touch2_x();
		y[1]=FT6336_read_touch2_y();


        ft6336_DEBUG("第一点:%d x:%d y:%d",temp[0],x[0],y[0]); 
		ft6336_DEBUG("第二点:%d x:%d y:%d\r\n",temp[1],x[1],y[1]);


        vTaskDelay(200 / portTICK_PERIOD_MS); 
 	}
	vTaskDelete(NULL);
}

//向FT6336写入一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:写数据长度
//返回值:0,成功;1,失败.
uint8_t FT6336_WR_Reg_Len(uint16_t reg,uint8_t *buf,uint8_t len)
{
	uint8_t i;
	uint8_t ret=0;
	IIC_Start();	 
	IIC_Send_Byte(FT6636_CMD_WR);	//发送写命令 	 
	IIC_Wait_Ack(); 	 										  		   
	IIC_Send_Byte(reg&0XFF);   	//发送低8位地址
	IIC_Wait_Ack();  
	for(i=0;i<len;i++)
	{	   
    	IIC_Send_Byte(buf[i]);  	//发数据
		ret=IIC_Wait_Ack();
		if(ret)break;  
	}
    IIC_Stop();					//产生一个停止条件	    
	return ret; 
}
//从FT6336读出一次数据
//reg:起始寄存器地址
//buf:数据缓缓存区
//len:读数据长度			  
void FT6336_RD_Reg_Len(uint16_t reg,uint8_t *buf,uint8_t len)
{
	uint8_t i; 
 	IIC_Start();	
 	IIC_Send_Byte(FT6636_CMD_WR);   	//发送写命令 	 
	IIC_Wait_Ack(); 	 										  		   
 	IIC_Send_Byte(reg&0XFF);   	//发送低8位地址
	IIC_Wait_Ack();  
 	IIC_Start();  	 	   
	IIC_Send_Byte(FT6636_CMD_RD);   	//发送读命令		   
	IIC_Wait_Ack();	   
	for(i=0;i<len;i++)
	{	   
    	buf[i]=IIC_Read_Byte(i==(len-1)?0:1); //发数据	  
	} 
    IIC_Stop();//产生一个停止条件     
} 



uint8_t FT6336_read_firmware_id(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_FIRMARE_ID);
}


uint8_t FT6336_read_device_mode(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_DEVICE_MODE);
}

uint8_t FT6336_read_td_status(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_TD_STATUS);
}

//第一触点
uint8_t FT6336_read_touch1_event(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH1_EVENT)>>4;
}

uint8_t FT6336_read_touch1_id(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH1_ID)>>4;
}

//左下角为坐标零点,水平Y轴,垂直X轴
//Y轴范围0~459
//X轴范围0~319
//touch1和touch2排列顺序为按面积排列,而ID号为按下的时间先后标号,该标号可代表按下的手指
//在第一点按下后ID记为0,事件为8,而抬起后ID与坐标保持最后数值,事件为4,此时第二个点数据一直为FF
//在第一点按下前提下按第二个点,ID记为1,事件为8,抬起后全恢复FF,而当第二个点的接触面积大于第一个点时,
//它将保持ID与坐标前提下与第一个点更换存储地址,第一个点抬起后,第二个点的依旧ID为1
//按下第三个点时,将与其它两个点进行面积对比后,直接抛弃面积最小的点
uint16_t FT6336_read_touch1_x(void)
{
	uint8_t read_buf[2];
	//IIC_read_addr_str(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH1_X,2,read_buf);
	FT6336_RD_Reg_Len(FT6336_ADDR_TOUCH1_X,read_buf,2);
	return ((read_buf[0]&0x0f)<<8)|read_buf[1];
}

uint16_t FT6336_read_touch1_y(void)
{
	uint8_t read_buf[2];
	//IIC_read_addr_str(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH1_Y,2,read_buf);
	FT6336_RD_Reg_Len(FT6336_ADDR_TOUCH1_Y,read_buf,2);
	return ((read_buf[0]&0x0f)<<8)|read_buf[1];
}

//第二触点
uint8_t FT6336_read_touch2_event(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH2_EVENT)>>4;
}

uint8_t FT6336_read_touch2_id(void)
{
	return IIC_read_addr_byte(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH2_ID)>>4;
}

uint16_t FT6336_read_touch2_x(void)
{
	uint8_t read_buf[2];
	IIC_read_addr_str(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH2_X,2,read_buf);
	return ((read_buf[0]&0x0f)<<8)|read_buf[1];
}

uint16_t FT6336_read_touch2_y(void)
{
	uint8_t read_buf[2];
	IIC_read_addr_str(IIC_ADDR_FT6336,FT6336_ADDR_TOUCH2_Y,2,read_buf);
	return ((read_buf[0]&0x0f)<<8)|read_buf[1];
}

